import random
from pypinyin import pinyin, Style

# 读取成语大全数据库
def load_idioms(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        idioms = file.readlines()
    return [idiom.strip() for idiom in idioms]

# 获取随机成语
def get_random_idiom(idioms):
    return random.choice(idioms)

# 判断成语是否在数据库中
def is_idiom_in_database(idiom, idioms):
    return idiom in idioms

# 获取机器接龙的成语
def get_machine_idiom(last_idiom, idioms):
    last_char_pinyin = pinyin(last_idiom[-1], style=Style.NORMAL)[0][0]
    available_idioms = [idiom for idiom in idioms if pinyin(idiom[0], style=Style.NORMAL)[0][0] == last_char_pinyin]

    if available_idioms:
        return random.choice(available_idioms)
    else:
        return None

# 获取提示
def get_hint(last_idiom, idioms):
    last_char_pinyin = pinyin(last_idiom[-1], style=Style.NORMAL)[0][0]
    hints = [idiom for idiom in idioms if pinyin(idiom[0], style=Style.NORMAL)[0][0] == last_char_pinyin]

    if hints:
        return random.choice(hints)
    else:
        return None

# 成语接龙游戏
def idiom_solitaire_game(idioms):
    print("欢迎来到成语接龙游戏！")
    current_idiom = get_random_idiom(idioms)
    print(f"机器给出成语：{current_idiom}")

    while True:
        user_input = input("请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：")
        user_input = user_input.strip()

        if user_input == "结束":
            print("游戏结束！")
            break
        elif user_input == "提示":
            hint = get_hint(current_idiom, idioms)
            if hint:
                print(f"提示：{hint}")
            else:
                print("没有更多提示了，请继续尝试。")
            continue

        # 检查用户输入的成语首字是否与机器给出的成语尾字同音
        last_char_pinyin = pinyin(current_idiom[-1], style=Style.NORMAL)[0][0]
        user_first_char_pinyin = pinyin(user_input[0], style=Style.NORMAL)[0][0]
        if user_first_char_pinyin != last_char_pinyin:
            print(f"成语接龙错误，应以'{current_idiom[-1]}'的拼音开头，请重新输入。")
            continue

        # 检查成语是否在数据库中
        if not is_idiom_in_database(user_input, idioms):
            print("输入的成语不在数据库中。")
            while True:
                user_decision = input("是否更换输入的成语？（输入'是'更换，输入'否'继续）：").strip()
                if user_decision == "是":
                    break  # 用户选择更换，跳出循环，重新输入成语
                elif user_decision == "否":
                    # 用户选择不更换，直接使用用户输入的成语继续接龙
                    current_idiom = user_input
                    machine_idiom = get_machine_idiom(current_idiom, idioms)
                    if machine_idiom:
                        print(f"机器接龙成语：{machine_idiom}")
                        current_idiom = machine_idiom
                    else:
                        print("机器无法在用户给出的成语后接龙，游戏结束！")
                    break  # 机器接龙后，跳出循环
                else:
                    print("输入无效，请输入'是'或'否'。")
            continue  # 重新输入成语

        print(f"用户给出成语：{user_input}")
        machine_idiom = get_machine_idiom(user_input, idioms)
        if machine_idiom:
            print(f"机器接龙成语：{machine_idiom}")
            current_idiom = machine_idiom
        else:
            print("机器无法接龙，游戏结束！")
            break

# 主函数
if __name__ == "__main__":
    file_path = 'E:/成语大全.txt'
    idioms = load_idioms(file_path)
    print(f"成语库中有 {len(idioms)} 个成语。")
    idiom_solitaire_game(idioms)